package edu.hrbu.kwaidu.interceptor;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import edu.hrbu.kwaidu.common.R;
import edu.hrbu.kwaidu.model.entity.SysUser;
import edu.hrbu.kwaidu.util.RedisUtil;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

import static edu.hrbu.kwaidu.constant.SystemConstant.EXCEPTION_BAD_CREDENTIALS;
import static edu.hrbu.kwaidu.constant.SystemConstant.REQ_HEADER_TOKEN;

/**
 * @author xudengyu
 */
public class LoginInterceptor implements HandlerInterceptor {

    private RedisUtil redisUtil;

    // 注意这里我们不能够通过依赖注入获取到spring中的bean：
    // 1. 这个拦截器并没有纳入到spring容器管理
    // 2. 【网上搜索到的】·拦截器在SpringContext初始化之前就执行了，Bean初始化之前它就执行了，所以它肯定是无法获取SpringIOC容器中的内容的。·
    public LoginInterceptor(RedisUtil redisUtil) {
        this.redisUtil = redisUtil;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//        log.info("redis::{}", stringRedisTemplate);

        R r = R.builder().code(401).message(EXCEPTION_BAD_CREDENTIALS).data(EXCEPTION_BAD_CREDENTIALS).build();

        // 从请求头获取token
        String token = request.getHeader(REQ_HEADER_TOKEN);

        // token为空，拦截
        if (token == null) {
            response.getWriter().println(JSONUtil.toJsonStr(r));
            return false;
        }

        // 从redis通过token获取信息，从请求头中获取phone ==》拼装前缀
        SysUser sysUserCache = redisUtil.getCurrentUserCache(token);
        List<String> permsCache = redisUtil.getPermsCache(token);

        // 拦截
        if (BeanUtil.isEmpty(sysUserCache)) {
            response.getWriter().println(JSONUtil.toJsonStr(r));
            return false;
        }
        // 如果用户不为空，token、perms、roles续命，放行
        redisUtil.setCurrentUserCache(token, sysUserCache);
        redisUtil.setPermsCache(token, permsCache);

        return true;

    }
}
